﻿using SIIE_ERP.Codigo;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;

namespace SIIE_ERP.BaseDatos.CRM.Transacciones
{
    public class dbo_Trans_Oportunidad
    {
        #region Propiedades

        private string _RFC;
        private string _Usuario;

        #endregion

        #region Constructores

        public dbo_Trans_Oportunidad(string RFC, string Usuario)
        {
            this._RFC = RFC;
            this._Usuario = Usuario;
        }

        #endregion

        #region INSERT

        public Respuesta Insert_Oportunidad(
            EstatusDocs_Id Estatus,
            string Cliente,
            string FechaDocumento,
            string FechaVencimiento,
            string FechaEntrega,
            string Colaborador,
            string Moneda,
            string Descripcion,
            string Referencia,
            string Ingresos,
            string Probabilidad,
            string Campana
        )
        {
            try
            {
                string Query = @"INSERT INTO dbo_Trans_Oportunidad_Cab
                             (
                                Id_Oportunidad,
                                RFC,
                                Secuencia,
                                Estatus,
                                Fecha_Documento,
                                Fecha_Vencimiento,                                                            
                                Fecha_Entrega,
                                Id_Colaborador,
                                Id_Moneda,
                                Id_Cliente,
                                Descripcion,
                                Referencia,
                                IngresosEstimados,
                                Probabilidad,
                                Id_Campana,
                                Fecha_Alta,
                                Usuario_Alta,
                                Fecha_Mantto,
                                Usuario_Mantto
                             )
                             VALUES
                             (
                                IIF(DCount('*', 'dbo_Trans_Oportunidad_Cab') = 0, 1, DMax('Id_Oportunidad', 'dbo_Trans_Oportunidad_Cab') + 1),
                                '@@RFC',
                                IIF(DCount('*', 'dbo_Trans_Oportunidad_Cab', ""RFC = '@@RFC'"") = 0, 1, DMax('Id_Oportunidad', 'dbo_Trans_Oportunidad_Cab', ""RFC = '@@RFC'"") + 1),
                                    
                                @@Estatus,
                                '@@Fecha_Documento',                                
                                '@@Fecha_Vencimiento',                                
                                '@@Fecha_Entrega',                                
                                @@Id_Colaborador,     
                                @@Id_Moneda,
                                @@Id_Cliente,
                                '@@Descripcion',
                                '@@Referencia',
                                @@IngresosEstimados,
                                @@Probabilidad,
                                @@Id_Campana,

                                NOW(),
                                '@@Usuario_Alta',
                                NOW(),
                                '@@Usuario_Mantto'
                             )";

                Query = Query.Replace("@@RFC", this._RFC);

                Query = Query.Replace("@@Estatus", Estatus.GetHashCode().ToString());
                Query = Query.Replace("@@Fecha_Documento", FechaDocumento.ToString());
                Query = Query.Replace("@@Fecha_Vencimiento", FechaVencimiento.ToString());
                Query = Query.Replace("@@Fecha_Entrega", FechaEntrega.ToString());
                Query = Query.Replace("@@Id_Colaborador", Colaborador);
                Query = Query.Replace("@@Id_Moneda", Moneda);
                Query = Query.Replace("@@Id_Cliente", Cliente);
                Query = Query.Replace("@@Referencia", Referencia);
                Query = Query.Replace("@@IngresosEstimados", Ingresos);
                Query = Query.Replace("@@Probabilidad", Probabilidad);
                Query = Query.Replace("@@Id_Campana", Campana);
                Query = Query.Replace("@@Descripcion", Descripcion.Replace("'", "''"));
                Query = Query.Replace("@@Usuario_Alta", this._Usuario);
                Query = Query.Replace("@@Usuario_Mantto", this._Usuario);

                return SrvDB.ExecuteQuery_Insert(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }

        #endregion

        #region SELECT

        public DataTable Get_Report(int Id_Campana, int Id_Cliente, int Id_Colaborador, int Estatus, int Tiempo)
        {
            string Query = @" 

                SELECT        

	                a.Id_Oportunidad, 
	                a.Secuencia, 
	                a.RFC, 
	                a.Id_Cliente, 
	                c.RFC_Cliente, 
	                c.Razon_Social, 
	                c.Nombre_Comercial, 
	                c.Calle, 
	                c.Num_Ext, 
	                c.Num_Int, 
	                c.Colonia, 
	                c.CP, 
	                c.Municipio, 
	
	                c.Calle + ' ' + c.Num_Ext + ' ' + 

                    Switch(
		                c.Num_Int   IS NULL, ', COL. ',
		                true, c.Num_Int + ', COL. '
                    )	
	
	                + c.Colonia + ', C.P. ' + c.CP + ', ' + c.Municipio + ', ' + Estado_Cliente.Nombre AS Direccion_Cliente, 
		
	                a.Fecha_Entrega, 
	                l.Id_Colaborador, 
	                l.Nombre AS Colaborador, 
	
	                o.Clave AS Clave_Moneda, 
	                o.Simbolo AS Simbolo_Moneda, 
	                o.Nombre AS Moneda, 
	                a.Estatus, 
	                m.Nombre AS Estatus_Desc, 
	                a.Descripcion, 
	                a.Referencia, 
	                a.Id_Campana, 
	
	                Switch(
		                dbo_Cat_Campana.Nombre IS NULL, 'Sin Campana',
		                true, dbo_Cat_Campana.Nombre
                    ) AS Nombre,

	                a.Probabilidad, 
	                a.IngresosEstimados

                FROM           

                ((((((((	dbo_Trans_Oportunidad_Cab AS a  
	
	                INNER JOIN dbo_Cat_Moneda AS o ON o.Id_Moneda = a.Id_Moneda )
	                INNER JOIN dbo_Cat_TipoCambio AS k ON k.Id_Moneda = a.Id_Moneda 	)
	                INNER JOIN dbo_Cat_Cliente AS c ON a.Id_Cliente = c.Id_Cliente 	)
	                INNER JOIN dbo_Cat_Colaborador AS l ON a.Id_Colaborador = l.Id_Colaborador )
	                INNER JOIN dbo_Cat_Estatus AS m ON a.Estatus = m.Estatus )
	                LEFT OUTER JOIN dbo_Cat_Campana ON a.Id_Campana = dbo_Cat_Campana.Id_Campana )
                    INNER JOIN dbo_Cat_SIIE_Pais AS Pais_Cliente ON Pais_Cliente.Id_SIIE_Pais = c.Id_Pais)
                    INNER JOIN dbo_Cat_SIIE_Estado AS Estado_Cliente ON Estado_Cliente.Id_SIIE_Estado = c.Id_Estado)
	
	            WHERE 

                        a.RFC = '@@RFC'                    
                    AND (@@Id_Campana = -1 OR @@Id_Campana = a.Id_Campana)
                    AND (@@Id_Cliente = -1 OR @@Id_Cliente = a.Id_Cliente)
                    AND (@@Id_Colaborador = -1 OR @@Id_Colaborador = a.Id_Colaborador)
                    AND (@@Estatus = -1 OR @@Estatus = a.Estatus)

                    AND 
					(
					(@@Tiempo = 1 and Year(a.Fecha_Alta) = Year(NOW()) and Month(a.Fecha_Alta) = Month(NOW())) or
					(@@Tiempo = 2 and Year(a.Fecha_Alta) = Year(DateAdd('m',-1,NOW())) and Month(a.Fecha_Alta) = Month(DateAdd('m',-1,NOW()))) or
					(@@Tiempo = 3 and Year(a.Fecha_Alta) = Year(NOW())) or
					(@@Tiempo = 4 and Year(a.Fecha_Alta) = Year(DateAdd('yyyy',-1,NOW()))) or
					(@@Tiempo = 5)
					)
                    ";
                         
            Query = Query.Replace("@@RFC", this._RFC);
            Query = Query.Replace("@@Id_Campana", Id_Campana.ToString());
            Query = Query.Replace("@@Id_Cliente", Id_Cliente.ToString());
            Query = Query.Replace("@@Id_Colaborador", Id_Colaborador.ToString());
            Query = Query.Replace("@@Estatus", Estatus.ToString());
            Query = Query.Replace("@@Tiempo", Tiempo.ToString());

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Oportunidades_Pipeline(int Id_Campana, int Id_Cliente, int Id_Colaborador, int Tiempo)
        {
            string Query = @"SELECT A1.*, 
                                    A2.Razon_Social as Desc_Cliente 
                             FROM 
                                    dbo_Trans_Oportunidad_Cab as A1 
                                        INNER JOIN dbo_Cat_Cliente as A2 ON A1.Id_Cliente = A2.Id_Cliente
                             WHERE A1.RFC = '@@RFC' 

                               AND A1.Estatus = 10
                               AND (@@Id_Campana = -1 OR A1.Id_Campana = @@Id_Campana)
                               AND (@@Id_Cliente = -1 OR A1.Id_Cliente = @@Id_Cliente)
                               AND (@@Id_Colaborador = -1 OR A1.Id_Colaborador = @@Id_Colaborador)

                               AND
                               (
							   (@@Tiempo = 1 and Year(A1.Fecha_Alta) = Year(NOW()) and Month(A1.Fecha_Alta) = Month(NOW())) or
							   (@@Tiempo = 2 and Year(A1.Fecha_Alta) = Year(NOW()) and ((Month(A1.Fecha_Alta) >= 10 and Month(A1.Fecha_Alta) <= 12 and Month(NOW()) >= 10 and Month(NOW()) <= 12) or (Month(A1.Fecha_Alta) >= 7 and Month(A1.Fecha_Alta) <= 9 and Month(NOW()) >= 7 and Month(NOW()) <= 9) or (Month(A1.Fecha_Alta) >= 4 and Month(A1.Fecha_Alta) <= 6 and Month(NOW()) >= 4 and Month(NOW()) <= 6) or (Month(A1.Fecha_Alta) >= 1 and Month(A1.Fecha_Alta) <= 3 and Month(NOW()) >= 1 and Month(NOW()) <= 3))) or
							   (@@Tiempo = 3 and Year(A1.Fecha_Alta) = Year(NOW()) and ((Month(A1.Fecha_Alta) >= 7 and Month(A1.Fecha_Alta) <= 12 and Month(NOW()) >= 7 and Month(NOW()) <= 12) or (Month(A1.Fecha_Alta) >= 1 and Month(A1.Fecha_Alta) <= 6 and Month(NOW()) >= 1 and Month(NOW()) <= 6))) or
							   (@@Tiempo = 4 and Year(A1.Fecha_Alta) = Year(NOW())) or
							   (@@Tiempo = 5 and Year(A1.Fecha_Alta) = Year(DateAdd('yyyy',-1,NOW())))
							   )

                            ";

            Query = Query.Replace("@@RFC", this._RFC);
            Query = Query.Replace("@@Tiempo", Tiempo.ToString());
            Query = Query.Replace("@@Id_Colaborador", Id_Colaborador.ToString());
            Query = Query.Replace("@@Id_Cliente", Id_Cliente.ToString());
            Query = Query.Replace("@@Id_Campana", Id_Campana.ToString());
            
            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Oportunidades()
        {
            string Query = @"SELECT A1.*, 
                                    A2.Razon_Social as Desc_Cliente 
                             FROM 
                                    dbo_Trans_Oportunidad_Cab as A1 
                                        INNER JOIN dbo_Cat_Cliente as A2 ON A1.Id_Cliente = A2.Id_Cliente
                             WHERE A1.RFC = '@@RFC'";

            Query = Query.Replace("@@RFC", this._RFC);

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Oportunidades(int Estrato)
        {
            string Query = @"SELECT A1.*, 
                                    A2.Razon_Social as Desc_Cliente 
                             FROM 
                                    dbo_Trans_Oportunidad_Cab as A1 
                                        INNER JOIN dbo_Cat_Cliente as A2 ON A1.Id_Cliente = A2.Id_Cliente
                             WHERE A1.RFC = '@@RFC' AND (@@Estrato = -1 OR @@Estrato = A1.Probabilidad)";

            Query = Query.Replace("@@RFC", this._RFC);
            Query = Query.Replace("@@Estrato", Estrato.ToString());

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Oportunidades_Por_Id(object Id)
        {
            string Query = @"SELECT A1.*, 
                                    A2.Razon_Social as Desc_Cliente 
                             FROM 
                                    dbo_Trans_Oportunidad_Cab as A1 
                                        INNER JOIN dbo_Cat_Cliente as A2 ON A1.Id_Cliente = A2.Id_Cliente
                             WHERE A1.RFC = '@@RFC' AND A1.Id_Oportunidad = @@Id";
            Query = Query.Replace("@@Id", ((Int32)Id).ToString());
            Query = Query.Replace("@@RFC", this._RFC);
            return SrvDB.ExecuteQuery_Get(Query);
        }

        #endregion

        #region UPDATE

        public Respuesta Update_Oportunidad(
            string IdOportunidad,
            EstatusDocs_Id Estatus,
            string FechaDocumento,
            string FechaVencimiento,
            string FechaEntrega,
            string Colaborador,
            string Moneda,
            string Descripcion,
            string Referencia,
            string Ingresos,
            string Probabilidad,
            string Campana
        )
        {
            try
            {
                string Query = @"UPDATE dbo_Trans_Oportunidad_Cab SET
                                
                                    Fecha_Documento = '@@Fecha_Documento',
                                    Fecha_Vencimiento = '@@Fecha_Vencimiento', 
                                                             
                                    Fecha_Entrega = '@@Fecha_Entrega',   
                                    Id_Colaborador =  @@Id_Colaborador, 
                                    Id_Moneda = @@Id_Moneda,
                                    Descripcion =  '@@Descripcion',
                                    Referencia =  '@@Referencia',
                                    IngresosEstimados = @@IngresosEstimados,
                                    Probabilidad = @@Probabilidad,
                                    Id_Campana = @@Id_Campana,
                                    Fecha_Mantto = NOW(),
                                    Usuario_Mantto = '@@Usuario_Mantto'
                                WHERE Id_Oportunidad = @@IdOportunidad
                            ";

                Query = Query.Replace("@@RFC", this._RFC);

                Query = Query.Replace("@@IdOportunidad", IdOportunidad);
                Query = Query.Replace("@@Fecha_Documento", FechaDocumento.ToString());
                Query = Query.Replace("@@Fecha_Vencimiento", FechaVencimiento.ToString());
                Query = Query.Replace("@@Fecha_Entrega", FechaEntrega.ToString());
                Query = Query.Replace("@@Id_Colaborador", Colaborador);
                Query = Query.Replace("@@Id_Moneda", Moneda);
                Query = Query.Replace("@@Referencia", Referencia);
                Query = Query.Replace("@@IngresosEstimados", Ingresos);
                Query = Query.Replace("@@Probabilidad", Probabilidad);
                Query = Query.Replace("@@Id_Campana", Campana);
                Query = Query.Replace("@@Descripcion", Descripcion.Replace("'", "''"));

                Query = Query.Replace("@@Usuario_Mantto", this._Usuario);

                return SrvDB.ExecuteQuery_Update(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }

        public Respuesta Update_Estatus(EstatusDocs_Id NuevoEstatus, int Id)
        {
            string Query = @"

                UPDATE dbo_Trans_Oportunidad_Cab SET Estatus = @@Estatus WHERE Id_Oportunidad = @@Id"

             .Replace("@@Estatus", NuevoEstatus.GetHashCode().ToString())
             .Replace("@@Id_Documento", Id.ToString());            

            return SrvDB.ExecuteQuery_Update(Query);
        }

        #endregion

    }
}
